package cn.hls.service;

import java.util.List;

import cn.hls.entity.ACL;
import cn.hls.entity.Module;

/**
 * @fileName: ACLService.java
 * @package: com.bangni.service
 * @Description: ACL权限Service接口
 * @author: yinghui.zhang
 * @email: uuhui@163.com
 * @date: 2015-5-3
 */
public interface ACLService extends BaseService<ACL> {
	/**
	 * 根据主体类型、主体标识、模块编号为查询条件查询该模块所拥有的权限
	 * 
	 * @param principalType
	 *            主体类型 角色、用户、机构
	 * @param principalId
	 *            主体标识 用户Id或角色Id及机构编号
	 * @param moduleId
	 *            模块编号
	 * @return List
	 * @throws Exception
	 *             异常
	 */
	@SuppressWarnings("rawtypes")
	List searchAclRecord(Integer principalType, Long principalId,
			Long moduleId) throws Exception;

	/**
	 * 授权过程 添加或更新授权操作
	 * 
	 * @param principalType
	 *            主体类型 用户、角色、机构
	 * @param principalSn
	 *            主体标识 用户Id或角色Id
	 * @param moduleId
	 *            资源标识 模块Id
	 * @param permission
	 *            权限 C/R/U/D 0 1 2 3
	 * @param yes
	 *            是否允许，true表示允许授权；false表示不允许授权
	 */
	void addOrUpdatePermission(Integer principalType, Long principalId,
			Long moduleId, Integer permission, boolean yes) throws Exception;

	/**
	 * 授权过程 添加或更新扩展授权操作
	 * 
	 * @param principalType
	 *            主体类型 用户或角色
	 * @param principalSn
	 *            主体标识 用户Id或角色Id
	 * @param moduleId
	 *            资源标识 模块Id
	 * @param permission
	 *            权限 C/R/U/D 0 1 2 3
	 * @param ex
	 *            　扩展权限
	 */
	void addOrUpdateExtPermission(Integer principalType, Long principalId,
			Long moduleId, String ex) throws Exception;

	/**
	 * 更新ACL信息
	 * 
	 * @param principalType主体类型
	 *            （角色、用户、机构)
	 * @param principalId
	 *            主体标识(角色、用户、机构编号)
	 * @param moduleId
	 *            模块编号
	 * @param yes
	 *            是否允许 （1－允许 0－禁止）
	 */
	void updateEnable(Integer principalType, Long principalId,
			Long moduleId, boolean yes) throws Exception;

	/**
	 * 根据主体类型、主体标识、模块编号查询ACL信息
	 * 
	 * @param principalType
	 *            主体类型 （角色、用户、机构)
	 * @param principalId主体标识
	 *            (角色、用户、机构编号)
	 * @param moduleId
	 *            模块编号
	 * @return ACL
	 */
	ACL findACL(Integer principalType, Long principalId, Long moduleId)
			throws Exception;

	/**
	 * 更新ACL信息
	 * 
	 * @param userId
	 *            用户编号
	 * @param moudleId
	 *            　模块编号
	 * @param yes
	 *            　yes 是否允许 （1－允许 0－禁止）
	 */
	void addOrUpdateUserEnable(Long userId, Long moudleId, Integer yes)
			throws Exception;

	/**
	 * 根据用户编号查询模块信息
	 * 
	 * @param userId
	 *            用户编号
	 * @return List<Module>
	 * @throws Exception
	 *             异常
	 */
	List<Module> searchModules(Long userId) throws Exception;

	/**
	 * 根据主体类型、标识删除权限信息
	 * 
	 * @param principalType
	 *            主体类型
	 * @param principalId
	 *            主体标识
	 * @throws Exception
	 *             操作数据库异常
	 */
	void delPermission(Integer principalType, Long principalId)
			throws Exception;

	/**
	 * 根据主体类型、标识、模块编号删除权限信息
	 * 
	 * @param principalType
	 *            主体类型
	 * @param principalId
	 *            主体标识
	 * @param moduleId
	 *            模块编号
	 * @throws Exception
	 *             操作数据库异常
	 */
	void delPermission(Integer principalType, Long principalId,
			Long moduleId) throws Exception;

	/**
	 * 根据模块编号查询acl信息是否存在
	 * 
	 * @param moduleId
	 *            模块编号
	 * @return boolean
	 * @throws Exception
	 *             访问数据库异常
	 */
	boolean isAclExists(Long moduleId) throws Exception;

	/**
	 * 根据用户编号、资源代码判断资源的操作权限是否存在
	 * 
	 * @param userId
	 *            用户编号
	 * @param moduleCode
	 *            资源代码
	 * @param permissionExt
	 *            操作权限
	 * @return boolean
	 * @throws Exception
	 *             异常
	 */
	boolean hasPermissionByResourceCode(Long userId, String moduleCode,
			int permissionExt) throws Exception;

	/**
	 * 根据用户编号、资源代码、状态判断资源的操作权限是否存在
	 * 
	 * @param userId
	 *            用户编号
	 * @param moduleCode
	 *            资源代码
	 * @param permissionExt
	 *            操作权限
	 * @param sys
	 *            状态
	 * @return boolean
	 * @throws Exception
	 *             异常
	 */
	boolean hasPermissionByResourceCode(Long userId, String moduleCode,
			int permissionExt, boolean sys) throws Exception;

	/**
	 * 根据模块代码查询模块信息
	 * 
	 * @param code
	 *            模块代码
	 * @return List
	 * @throws Exception
	 *             异常
	 */
	@SuppressWarnings("rawtypes")
	List findByCode(String code) throws Exception;

	/**
	 * 根据模块编号删除Acl信息
	 * 
	 * @param moduleId
	 *            模块编号
	 * @throws Exception
	 *             异常
	 */
	void deleteAclByModule(Long moduleId) throws Exception;
}
